현장에서 들어오는 전력을 감시하여 기준의 전력(피크치 기준점)을 초과하였을 때 이 값을 그래픽 판넬에 출력함과 동시에 경보를 발생시킬 수 있다.
적용 : 현장에서 A-버튼을 누르게 되면 피크치가 있는 경우 그래픽 판넬에 피크치를 출력하고, 피크치가 없는 경우에는 현재값을 출력해 주면된다.
또한, B-버튼을 누르게 되면 피크치를 Reset 시켜준다.
스크립트의 부분을 4부분으로 나눈다. (이것은 사용자가 편한대로 구성하는 것이 좋다.)
1) 피크치를 계산하여 아날로그 메모리 태그에 저장시킨다.(주의 : 여기서는 한순간에 지정 전력을 넘었을 때 피크치로 간주하지 않고 지정전력을 연속하여 10분이상 지속되었을 때를 피크치로 간주한다. 그리고 현장에서 들어오는 전력은 8개라고 가정한다.)
Description, 피크치 계산하기,
ScanTime, 1,
Data, char, flag, 10,
Data, char, watttag, 20,
Data, char, peektag, 20,
Data, int, i, 1,
Data, double, wattvalue, 1,
Data, double, peekvalue, 1,
Data, char, alarmtag, 20,
Data, double, maxvalue, 10,
Data, int, count, 10,
Programm,
for(i=1; i<9 ; i=i+1){ // for문을 8번 수행하는 이유는 감시해야 할 전력이 8군데 이기 때문이다.
@sprintf(watttag, "WATT%d",i); // WATT1 ~ WATT8번까지 실전력을 받는 태그이다.
@sprintf(peektag, "PEEKW%d",i); // PEEK1 ~ PEEK8 번까지 피크치를 저장하는 아날로그 메모리 태그이다.
@sprintf(alarmtag, "PEEKLAMP%d",i); // PEEKLAMP1 ~ PEEKLAMP8 피크치가 발생하였을 경우 경보를 내보내기 위한 디지털 출력 태그
wattvalue = @GetTagValue(watttag);
peekvalue = @GetTagValue(peektag);
if (wattvalue >= $PEEKSET ){
count[i]=count[i]+1;
if(wattvalue < maxvalue[i]) return;
if(wattvalue >= maxvalue[i]){
maxvalue[i]=wattvalue;
if( count[i] >=600 ){ // 이 스크립트의 ScanTime이 1초이므로 60*10분= 600이 된다.
@SetTagValue(peektag,maxvalue[i]);
if( flag[i]== 0){
@ON(alarmtag);
flag[i]=1;
}
}
return;
}
}
else {
if( count[i] >= 600 ){
if(maxvalue[i] > peekvalue ){
@SetTagValue(peektag,maxvalue[i]);
@ON(alarmtag);
count[i]=0;
maxvalue[i]=0;
flag[i]=0;
}
else{
count[i]=0;
maxvalue[i]=0;
flag[i]=0;
}
}
else{
count[i]=0;
maxvalue[i]=0;
flag[i]=0;
}
}
}
2) A-버튼의 상태값이 OFF일 때는 현재값을 그래픽 판넬에 출력한다.
Description, A버튼 OFF시 현재치를 보여준다.,
ScanTime, 1,
Data, int, i, 1,
Data, char, watttag, 20,
Data, char, displaytag, 20,
Data, double, wattvalue, 1,
Data, double, oldwattvalue, 10,
Data, char, Abtflag, 1,
Programm,
if($DI_A_BT == 1 && Abtflag==0) return;
if($DI_A_BT == 0 && Abtflag==0){
Abtflag=1;
return;
}
if($DI_A_BT == 1 && Abtflag==1){
Abtflag=0;
for( i=1; i< 9; i=i+1){
oldwattvalue[i] = 0;
}
return;
}
if($DI_A_BT == 0 && Abtflag==1){
for( i=1; i< 9; i=i+1){
@sprintf(watttag, "WATT%d",i);
@sprintf(displaytag, "OUT%d",i);
wattvalue=@GetTagValue(watttag);
if(wattvalue == oldwattvalue[i]) return;
if(wattvalue != oldwattvalue[i]){
oldwattvalue[i] = wattvalue;
@SetTagValue(displaytag,wattvalue);
}
}
}
3) A-버튼의 상태값이 ON시에 피크값이 있는 경우 피크값을 출력하고, 피크값이 없는 경우 현재 전력값을 보여준다.
Description, A버튼 ON시 피크치/현재치를 보여준다.,
ScanTime, 1,
Data, int, i, 1,
Data, char, watttag, 20,
Data, char, peektag, 20,
Data, char, displaytag, 20,
Data, double, wattvalue, 1,
Data, double, peekvalue, 1,
Data, char, flag, 10,
Data, double, oldwattvalue, 10,
Data, char, Abtflag, 1,
Programm,
if($DI_A_BT == 0 && Abtflag==0) return;
if($DI_A_BT == 1 && Abtflag==0){
Abtflag=1;
return;
}
if($DI_A_BT == 0 && Abtflag==1){
Abtflag=0;
for( i=1; i< 9; i=i+1){
oldwattvalue[i] = 0;
flag[i]=0;
}
return;
}
if($DI_A_BT == 1 && Abtflag==1){
for( i=1; i< 9; i=i+1){
@sprintf(watttag, "WATT%d",i);
@sprintf(peektag, "PEEKW%d",i);
@sprintf(displaytag, "OUT%d",i);
wattvalue=@GetTagValue(watttag);
peekvalue=@GetTagValue(peektag);
if(flag[i] == 1 ) return;
if(peekvalue != 0 ){
@SetTagValue(displaytag,peekvalue);
flag[i]=1;
return;
}
else{
if(wattvalue == oldwattvalue[i]) return;
if(wattvalue != oldwattvalue[i]){
oldwattvalue[i] = wattvalue;
@SetTagValue(displaytag,wattvalue);
}
}
}
}
4) B-버튼 ON시 피크값들을 Reset한다.
Description, 피크치를 리셋해준다.,
ScanTime, 1,
Data, int, i, 1,
Data, char, buf, 20,
Programm,
if($DI_B_BT==0 ) return;
for(i=1; i< 9; i=i+1){
@sprintf(buf,"PEEKW%d",i);
@SetTagValue(buf, 0);
}
위와 같이 작성을 함으로써 피크치를 계산할 수 있으며 계산된 피크치를 그래픽 판넥에 출력할 수 있다.